//package org.mzy.basic.util;
//
//import org.apache.commons.lang3.exception.ExceptionUtils;
//import org.apache.rocketmq.client.producer.SendCallback;
//import org.apache.rocketmq.client.producer.SendResult;
//import org.apache.rocketmq.spring.core.RocketMQTemplate;
//import org.mzy.basic.config.BussinessException;
//import org.mzy.order.domain.MessageBody;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.messaging.Message;
//import org.springframework.messaging.support.MessageBuilder;
//import org.springframework.stereotype.Component;
//
//@Component
//public class MQService {
//    private final static Logger logger = LoggerFactory.getLogger(MQService.class);
//    @Autowired
//    public RocketMQTemplate rocketMQTemplate;
//
//    ;
//
//    /**
//     * 发送消息，通用
//     *
//     * @param msg_type
//     * @param destination
//     * @param payload
//     */
//    private void sendMsg(MSG_TYPE msg_type, String destination, Object payload, String msgSource) {
//        String msgKey = uuidu.simpleUUID();
//        MessageBody msgBody = new MessageBody(msgKey, payload, msgSource);
//        Message<MessageBody> message = MessageBuilder.withPayload(msgBody).setHeader("KEYS", msgKey).build();
//        logger.info(String.format("消息发送 MQService 开始: %s %s", destination, message));
//        SendResult result = null;
//        switch (msg_type) {
//            case ONEWAY:
//                rocketMQTemplate.sendOneWay(destination, message);
//                break;
//            case ASYNC:
//                rocketMQTemplate.asyncSend(destination, message, new SendCallback() {
//                    @Override
//                    public void onSuccess(SendResult sendResult) {
//                    }
//
//                    @Override
//                    public void onException(Throwable throwable) {
//                        logger.error("MQService:" + ExceptionUtils.getStackTrace(throwable));
//                        throw new BussinessException(String.format("消息发送失败 topic_tag:%s", destination));
//                    }
//                });
//                break;
//            case SYNC:
//                result = rocketMQTemplate.syncSend(destination, message);
//                break;
//        }
//        logger.info(String.format("消息发送 MQService 结束: msgId: %s dest: %s msg: %s", result != null ? result.getMsgId() : "", destination, message));
//    }
//
//    /**
//     * 同步发送消息,会确认应答
//     *
//     * @param destination
//     * @param payload
//     */
//    public void syncSendMsg(String destination, Object payload, String msgSource) {
//        sendMsg(MSG_TYPE.SYNC, destination, payload, msgSource);
//    }
//
//    /**
//     * 同步发送消息,会确认应答
//     *
//     * @param topic
//     * @param tag
//     * @param payload
//     */
//    public void syncSendMsg(String topic, String tag, Object payload, String msgSource) {
//        // 发送的消息体，消息体必须存在
//        // 业务主键作为消息key
//        String destination = topic + ":" + tag;
//        syncSendMsg(destination, payload, msgSource);
//    }
//
//    /**
//     * 异步消息发送,异步日志确认异常
//     *
//     * @param destination
//     * @param payload
//     */
//    public void asyncSendMsg(String destination, Object payload, String msgSource) {
//        sendMsg(MSG_TYPE.ASYNC, destination, payload, msgSource);
//    }
//
//    /**
//     * 异步消息发送,异步日志确认异常
//     *
//     * @param topic
//     * @param tag
//     * @param payload
//     * @return
//     */
//    public void asyncSendMsg(String topic, String tag, Object payload, String msgSource) {
//        // 发送的消息体，消息体必须存在
//        // 业务主键作为消息key
//        String destination = topic + ":" + tag;
//        asyncSendMsg(destination, payload, msgSource);
//    }
//
//    /**
//     * 单向发送消息，不关注结果
//     *
//     * @param destination
//     * @param payload
//     */
//    public void oneWaySendMsg(String destination, Object payload, String msgSource) {
//        sendMsg(MSG_TYPE.ONEWAY, destination, payload, msgSource);
//    }
//
//    /**
//     * 单向发送消息，不关注结果
//     *
//     * @param topic
//     * @param tag
//     * @param payload
//     */
//    public void oneWaySendMsg(String topic, String tag, Object payload, String msgSource) {
//        // 发送的消息体，消息体必须存在
//        // 业务主键作为消息key
//        String destination = topic + ":" + tag;
//        oneWaySendMsg(destination, payload, msgSource);
//    }
//
//    private static enum MSG_TYPE {ONEWAY, ASYNC, SYNC}
//}
